package dao;

import entidad.Usuario;
import frontera.VentanaPrincipal;
import java.util.ArrayList;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

public class UsuarioDAO {
    private EntityManagerFactory emf = JPAUtil.getEntityManagerFactory();
    
    public void crear(Usuario object) {
        //Agregar permisos a BD
        VentanaPrincipal.controlPermiso.agregar(object.getPermisos());
        
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        try {
            em.persist(object);
            em.flush();//new line
            em.getTransaction().commit();
            
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }

    public Usuario leer(Usuario object) {
        EntityManager em = emf.createEntityManager();
        Usuario usuario = null;
        Query q = em.createQuery("SELECT u FROM Usuario u "
                + "WHERE u.cedula = :cedula")
                .setParameter("cedula", object.getCedula());
        try {
            usuario = (Usuario) q.getSingleResult();
        } catch(NoResultException e){
            usuario = null;
        } catch (NonUniqueResultException e) {
            usuario = (Usuario) q.getResultList().get(0);
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            em.close();
            return usuario;
        }
    }
    
    public Usuario existeLogin(String nombredeUsuario, String contraseña) {
        EntityManager em = emf.createEntityManager();
        Usuario usuario = null;
        Query q = em.createQuery("SELECT u FROM Usuario u "
                + "WHERE u.nombredeUsuario = :nombredeUsuario AND "
                + "      u.contraseña = :contraseña")
                .setParameter("nombredeUsuario", nombredeUsuario)
                .setParameter("contraseña", contraseña);
        try {
            usuario = (Usuario) q.getSingleResult();
        } catch (NonUniqueResultException e) {
            usuario = (Usuario) q.getResultList().get(0);
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            em.close();
            return usuario;
        }
    }
    
    public ArrayList<Usuario> buscar(String str) {
        EntityManager em = emf.createEntityManager();
        Query q = em.createQuery("SELECT u FROM Usuario u ");
                //+ "WHERE u.codigo = :codigo")
                //.setParameter("codigo", str);
        
        ArrayList<Usuario> ret = (ArrayList<Usuario>) q.getResultList();
        
        em.close();
        return ret;
    }

    public boolean actualizar(Usuario object, Usuario nuevoObjeto) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        boolean ret = false;
        try {
            object = leer(object);
            
            object.setCargo(nuevoObjeto.getCargo());
            object.setContraseña(nuevoObjeto.getContraseña());
            object.setNombre(nuevoObjeto.getNombre());
            object.setNombredeUsuario(nuevoObjeto.getNombredeUsuario());
            object.setPermisos(nuevoObjeto.getPermisos());
            
            em.merge(object);
            em.getTransaction().commit();
            ret = true;
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
            return ret;
        }
    }
    
    public boolean eliminar(Usuario object) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        boolean ret = false;
        try {
            em.remove(object);
            em.getTransaction().commit();
            ret = true;
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
            return ret;
        }
    }
}
